﻿#pragma once
#include<deque>
//
//template<class T>
//class stack
//{
//private:
//	T* _a;
//	size_t _top;
//	size_t _capacity;
//};

//#include<vector>
//namespace sy
//{
//	template<class T>
//	class stack
//	{
//	public:
//		stack() {}
//		void push(const T& x) { _c.push_back(x); }
//		void pop() { _c.pop_back(); }
//		T& top() { return _c.back(); }
//		const T& top()const { return _c.back(); }
//		size_t size()const { return _c.size(); }
//		bool empty()const { return _c.empty(); }
//	private:
//		std::vector<T> _c;
//	};
//}
namespace sy
{
	template<class T, class Container = deque<T>>
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_back();
		}

		const T& top() const
		{
			//return _con.func();
			return _con.back();
		}

		size_t size() const
		{
			return _con.size();
		}

		bool empty() const
		{
			return _con.empty();
		}

	private:
		Container _con;
	};

	/*void func()
	{
		cout << "void func()" << endl;
	}*/
}


//
//#include <queue>
//using namespace std;
//
//class MyStack {
//public:
//    MyStack() {}
//
//    void push(int x) {
//        // 将元素推入当前非空队列，若都为空则选择q2
//        if (!q1.empty()) {
//            q1.push(x);
//        }
//        else {
//            q2.push(x);
//        }
//    }
//
//    int pop() {
//        int top;
//        if (!q1.empty()) {
//            // 将q1中除最后一个元素外的所有元素转移到q2
//            while (q1.size() > 1) {
//                q2.push(q1.front());
//                q1.pop();
//            }
//            top = q1.front();
//            q1.pop();
//        }
//        else {
//            // 将q2中除最后一个元素外的所有元素转移到q1
//            while (q2.size() > 1) {
//                q1.push(q2.front());
//                q2.pop();
//            }
//            top = q2.front();
//            q2.pop();
//        }
//        return top;
//    }
//
//    int top() {
//        // 直接返回非空队列的尾部元素（即最后入队的元素）
//        if (!q1.empty()) {
//            return q1.back();
//        }
//        else {
//            return q2.back();
//        }
//    }
//
//    bool empty() {
//        return q1.empty() && q2.empty();
//    }
//
//private:
//    queue<int> q1;
//    queue<int> q2;
//};
//
//class MyStack {
//    public:
//        MyStack() {
//    
//        }
//    
//        void push(int x)
//        {
//            if (!q1.empty())
//            {
//                q1.push(x);
//            }
//            else
//            {
//                q2.push(x);
//            }
//        }
//    
//        int pop()
//        {
//            queue<int>* empty = &q1;
//            queue<int>* noempty = &q2;
//            //假设
//            if (!q1.empty())
//            {
//                noempty = &q1;
//                empty = &q2;
//            }
//            while (noempty->size() > 1)
//            {
//                empty->push(noempty->front());
//                noempty->pop();
//            }
//            int top = noempty->front();
//            noempty->pop();
//            return top;
//        }
//    
//        int top() {
//            if (!q1.empty())
//            {
//                return q1.back();
//            }
//            else {
//                return q2.back();
//            }
//        }
//    
//        bool empty() {
//            return q1.empty() && q2.empty();
//        }
//    private:
//        queue<int> q1;
//        queue<int> q2;
//    };
//    
//    /**
//     * Your MyStack object will be instantiated and called as such:
//     * MyStack* obj = new MyStack();
//     * obj->push(x);
//     * int param_2 = obj->pop();
//     * int param_3 = obj->top();
//     * bool param_4 = obj->empty();
//     */